<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // push push()  方法可向数组的末尾添加一个或多个元素，并返回新的长度。
      const arr = [1, 2, 3, 4]
      Array.prototype.myPush = function (...data) {
        for (let i = 0; i < data.length; i++) {
          this[this.length] = data[i]
        }
        return this.length
      }
      console.log(arr.myPush(5, 6))
      console.log(arr)

      // pop   pop() 方法将删除 arrayObject 的最后一个元素，把数组长度减 1，
      //       并且返回它删除的元素的值。如果数组已经为空，则 pop() 不改变数组，并返回 undefined 值。
      // const arr1 = [1]
      const arr1 = [1, 2, 3, 4]
      Array.prototype.myPop = function () {
        if (this.length < 1) return undefined
        let res = this[this.length - 1]
        this.length--
        return res
      }
      console.log(arr1.myPop())
      console.log(arr1)

      //unshift()  unshift() 方法可向数组的开头添加一个或更多元素，并返回新的长度。
      const arr2 = [1, 2, 3, 4]
      Array.prototype.myUnshift = function (...data) {
        const newArr = []
        for (let i = 0; i < data.length; i++) {
          newArr[newArr.length] = data[i]
        }
        for (let j = 0; j < this.length; j++) {
          newArr[newArr.length] = this[j]
        }
        // console.log(newArr)
        // this=newArr
        for (let l = 0; l < newArr.length; l++) {
          this[l] = newArr[l]
        }
        return this.length
      }
      console.log(arr2.myUnshift(5, 6))
      console.log(arr2)

      // shift()  shift() 方法用于把数组的第一个元素从其中删除，并返回第一个元素的值。
      const arr3 = [1, 2, 3, 4]
      Array.prototype.myShift = function () {
        const del = this[0]
        for (let i = 0; i < this.length - 1; i++) {
          this[i] = this[i + 1]
        }
        this.length--
        return del
      }
      console.log(arr3.myShift())
      console.log(arr3)

      //  sort() sort() 方法用于对数组的元素进行排序。
      //         排序顺序可以是字母或数字，并按升序或降序。
      //         默认排序顺序为按字母升序。
      const arr6 = [1, 2, 3, 4]

      //  reverse()  reverse() 方法用于颠倒数组中元素的顺序。
      const arr4 = [1, 2, 3, 4]
      Array.prototype.myReverse = function () {
        const newArr = []
        for (let i = 0; i < this.length; i++) {
          newArr[i] = this[this.length - i - 1]

          // for (let j = this.length - 1; j < 0; j--) {
          //   newArr[i] = this[j]
          // }
        }
        // console.log(this)
        console.log(newArr)
        for (let l = 0; l < newArr.length; l++) {
          this[l] = newArr[l]
        }
      }
      arr4.myReverse()
      console.log(arr4)

      // splice()  splice() 方法用于添加或删除数组中的元素。
      const arr5 = [1, 2, 3, 4, 5]
      Array.prototype.mySplice = function (index, num, ...add) {
        // console.log(add)
        // 只传了index
        if (num === undefined) {
          // console.log('0')
          this.length = index
          return
        }
        // 只传了index 和num
        if (add === []) {
          console.log(1)
          for (let i = index; i < this.length - num; i++) {
            this[i] = this[i + num]
          }
          console.log(this)
          this.length = this.length - num
        } else {
          // console.log(add)
          const newArr = []
          // 保存原数组应删除数据以后的值
          for (let i = 0; i < this.length - index - num; i++) {
            newArr[i] = this[index + num]
          }
          // 添加数据到对应的位置
          for (let j = index; j < add.length + index; j++) {
            this[j] = add[j - index]
          }
          // 把保存的原数组的尾值覆盖在添加数据后
          for (let l = 0; l < newArr.length; l++) {
            this[l + index + add.length] = newArr[l]
          }
        }
      }
      arr5.mySplice(2, 2, 9, 8, 7)
      console.log(arr5)
    </script>
  </body>
</html>
